# -*- coding: utf-8 -*-
import os
import torch

def abs_path(relative_path):
    """将相对路径解析为绝对路径"""
    current_dir = os.path.dirname(os.path.abspath(__file__))
    return os.path.join(current_dir, relative_path)

class ParameterConfig():
    def __init__(self):
        # 判断是否使用GPU（1.电脑里必须有显卡；2.必须安装cuda版本的pytorch）
        self.device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

        # 各类路径配置（使用绝对路径）
        self.vocab_path = abs_path('vocab/vocab.txt')
        self.chat_path = abs_path('data/chat_train.pkl')
        self.train_path = abs_path('data/medical_train.pkl')
        self.valid_path = abs_path('data/medical_valid.pkl')
        self.config_json = abs_path('config/config.json')
        self.save_model_path = abs_path('save_model')
        self.log_path = abs_path('log')
        self.pretrained_model = ''  # 如果使用预训练模型，请写绝对路径或使用abs_path
        self.save_samples_path = abs_path('sample')

        # 模型训练相关配置
        self.ignore_index = -100  # 忽略一些字符：句子需要长度补齐，针对补的部分没有意义，所以一般不进行梯度更新
        self.max_history_len = 3  # dialogue history 的最大长度
        self.max_len = 300  # 每个 utterance 的最大长度，超过指定长度则进行截断
        self.repetition_penalty = 10.0  # 重复惩罚参数，若生成的对话重复性较高，可适当提高该参数
        self.topk = 4  # 最高 k 选 1。默认 8
        self.batch_size = 8  # 一个批次几个样本
        self.epochs = 4  # 训练几轮
        self.loss_step = 1  # 多少步汇报一次 loss
        self.lr = 2.6e-5
        self.eps = 1.0e-09  # 为了增加数值计算的稳定性而加到分母里的项，防止除以零
        self.max_grad_norm = 2.0 # 梯度裁剪---->限制梯度最大值，防止梯度爆炸，提升训练稳定性
        self.gradient_accumulation_steps = 4 # 梯度累积---->模拟大 batch 训练，节省显存，提升训练效果
        self.warmup_steps = 100  # warmup 预热学习率---->逐步增大学习率，有助于收敛更快、效果更好

if __name__ == '__main__':
    pc = ParameterConfig()
    print(pc.train_path)
    print(pc.device)
    print(pc.batch_size)
    print(pc.vocab_path)
